// 快递信息路由处理函数文件
// 该文件包含了快递信息相关API的具体实现逻辑

const { sequelize } = require('../db/index');
const initModels = require('../models/init-models');
const { success, error } = require('../middleware/responseHandler');

// 初始化模型
const models = initModels(sequelize, require('sequelize').DataTypes);
const ExpressInfo = models.express_info;
const SalesOrders = models.sales_orders;

/**
 * 获取快递信息列表
 * @param {Request} req - 请求对象
 * @param {Response} res - 响应对象
 */
async function getExpressInfoList(req, res) {
  try {
    // 获取分页参数
    const page = parseInt(req.query.page) || 1;
    const pageSize = parseInt(req.query.pageSize) || 10;
    
    // 查询快递信息列表
    const { count, rows } = await ExpressInfo.findAndCountAll({
      limit: pageSize,
      offset: (page - 1) * pageSize,
      order: [['created_at', 'DESC']]
    });
    
    // 返回成功响应
    success(res, {
      expressInfos: rows,
      pagination: {
        totalCount: count,
        currentPage: page,
        pageSize: pageSize,
        totalPages: Math.ceil(count / pageSize)
      }
    }, '获取快递信息列表成功');
  } catch (err) {
    // 返回错误响应
    error(res, err, '获取快递信息列表失败');
  }
}

/**
 * 根据ID获取快递信息
 * @param {Request} req - 请求对象
 * @param {Response} res - 响应对象
 */
async function getExpressInfoById(req, res) {
  try {
    const { id } = req.params;
    
    // 查找快递信息
    const expressInfo = await ExpressInfo.findByPk(id, {
      include: [{
        model: SalesOrders,
        as: 'sales_orders',
        attributes: ['order_id', 'order_number', 'customer_id', 'total_amount']
      }]
    });
    
    if (!expressInfo) {
      return error(res, null, '快递信息不存在');
    }
    
    // 返回成功响应
    success(res, expressInfo, '获取快递信息成功');
  } catch (err) {
    // 返回错误响应
    error(res, err, '获取快递信息失败');
  }
}

/**
 * 添加新的快递信息
 * @param {Request} req - 请求对象
 * @param {Response} res - 响应对象
 */
async function addExpressInfo(req, res) {
  try {
    // 从请求体获取数据
    const { express_company, express_number } = req.body;
    
    // 创建新的快递信息记录
    const newExpressInfo = await ExpressInfo.create({
      express_company,
      express_number
    });
    
    // 返回成功响应
    success(res, newExpressInfo, '添加快递信息成功');
  } catch (err) {
    // 返回错误响应
    error(res, err, '添加快递信息失败');
  }
}

/**
 * 更新快递信息
 * @param {Request} req - 请求对象
 * @param {Response} res - 响应对象
 */
async function updateExpressInfo(req, res) {
  try {
    const { id } = req.params;
    
    // 从请求体获取更新数据
    const { express_company, express_number } = req.body;
    
    // 查找要更新的快递信息
    const expressInfo = await ExpressInfo.findByPk(id);
    
    if (!expressInfo) {
      return error(res, null, '快递信息不存在');
    }
    
    // 更新快递信息
    await expressInfo.update({
      express_company: express_company || expressInfo.express_company,
      express_number: express_number || expressInfo.express_number
    });
    
    // 返回成功响应
    success(res, expressInfo, '更新快递信息成功');
  } catch (err) {
    // 返回错误响应
    error(res, err, '更新快递信息失败');
  }
}

/**
 * 删除快递信息
 * @param {Request} req - 请求对象
 * @param {Response} res - 响应对象
 */
async function deleteExpressInfo(req, res) {
  try {
    const { id } = req.params;
    
    // 查找要删除的快递信息
    const expressInfo = await ExpressInfo.findByPk(id);
    
    if (!expressInfo) {
      return error(res, null, '快递信息不存在');
    }
    
    // 检查是否有订单关联到这个快递信息
    const associatedOrders = await SalesOrders.count({
      where: {
        express_id: id
      }
    });
    
    if (associatedOrders > 0) {
      return error(res, null, `有${associatedOrders}个订单关联到此快递信息，无法删除`);
    }
    
    // 删除快递信息记录
    await expressInfo.destroy();
    
    // 返回成功响应
    success(res, null, '删除快递信息成功');
  } catch (err) {
    // 返回错误响应
    error(res, err, '删除快递信息失败');
  }
}

/**
 * 获取关联到指定快递信息的订单列表
 * @param {Request} req - 请求对象
 * @param {Response} res - 响应对象
 */
async function getOrdersByExpressId(req, res) {
  try {
    const { id } = req.params;
    
    // 检查快递信息是否存在
    const expressInfo = await ExpressInfo.findByPk(id);
    if (!expressInfo) {
      return error(res, null, '快递信息不存在');
    }
    
    // 获取关联的订单列表
    const orders = await SalesOrders.findAll({
      where: {
        express_id: id
      },
      attributes: ['order_id', 'order_number', 'customer_id', 'total_amount', 'status']
    });
    
    // 返回成功响应
    success(res, orders, '获取关联订单列表成功');
  } catch (err) {
    // 返回错误响应
    error(res, err, '获取关联订单列表失败');
  }
}

// 导出处理函数
module.exports = {
  getExpressInfoList,
  getExpressInfoById,
  addExpressInfo,
  updateExpressInfo,
  deleteExpressInfo,
  getOrdersByExpressId
};